#include <bits/stdc++.h>
using namespace std;

/**
 * 洛谷 P3865
 * 用单调双端队列解决离线 RMQ
 * 复杂度 O(n + Qlogn)
 */
int main() {
  cin.tie(0)->sync_with_stdio(0);
  int n, m;
  cin >> n >> m;
  vector<int> a(n + 1);
  for (int i = 1; i <= n; i ++) cin >> a[i];

  // 将所有的 query 按右端点进行排序（用桶排序可以做到 O(m))
  vector<vector<pair<int, int>>> query(n + 1);
  for (int i = 0; i < m; i++) {
    int l, r;
    cin >> l >> r;
    query[r].emplace_back(l, i);
  }

  deque<int> deq;
  vector<int> ans(m);
  for (int i = 1; i <= n; i++) {
    // 维护 1~i 的单调栈
    while (!deq.empty() && a[deq.back()] <= a[i]) {
      deq.pop_back();
    }
    deq.push_back(i);

    // 对于所有右端点是 i 的询问，它的最大值一定位于这个单调栈内
    // 所以可以通过二分左端点进行查询
    for (auto [l, id] : query[i]) {
      ans[id] = a[*lower_bound(deq.begin(), deq.end(), l)];
    }
  }

  for (int i = 0; i < m; i ++) cout << ans[i] << '\n';
}